/**
* @file libreria.cpp
*
*	 Nel file libreria.cpp vengono implementata la classe Service e le funzioni descritte
*	 in libreria.h
*	
* @author Favale Angelo
* @author Fagioli Alessio
*
* @version 1.0
*/
#include "libreria.h"



int inizializzaSocket()
{ 
	int s;
	s = socket(AF_INET, SOCK_STREAM,0);
	if (s == (-1))
	{
		printf("socket() failed, Err: %d\"%s\"\n", errno, strerror(errno));
		exit(1);
	}
	return s;

}



int inizializza_client( char * ip_server, int porta_server )
{

	int s,ret;
	struct sockaddr_in server_addr;
	
	s=inizializzaSocket();
	
	memset( &server_addr, 0, sizeof(server_addr) ); //azzera la struttura indirizzo
	
	server_addr.sin_family = AF_INET;
	ret = inet_aton( ip_server, &server_addr.sin_addr );//copio (facendo un casting) l'indirizzo IP passato come parametro
	server_addr.sin_port = htons(porta_server);
	ret = connect( s, (struct sockaddr *) &server_addr, sizeof(server_addr) );

	if (ret == (-1))
	{
		printf("Connessione al Service Provider non riuscita...\n");
		perror("Errore connessione\n");
		return -1;
	}

	return s;

}


int inizializza_server(char * ip_server, int porta_server, int queue_size){

	int s_listening,ret;
	struct sockaddr_in my_addr;
	
	s_listening = inizializzaSocket();

	int optval = 1;
	setsockopt(s_listening, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval); 

	memset( &my_addr, 0, sizeof(my_addr) ); //azzera la struttura indirizzo
	my_addr.sin_family = AF_INET;
	ret = inet_aton(ip_server,&my_addr.sin_addr);	
	my_addr.sin_port = htons(porta_server);
	
	ret = bind( s_listening, (struct sockaddr*) &my_addr, sizeof(my_addr) ); //viene associato l'indirizzo del server al Socket
	if (ret == (-1))
	{
		printf("bind() failed, Err: %d \"%s\"\n", errno, strerror(errno));
		return -1;
	}
	ret = listen( s_listening, queue_size ); //indica che il Server è disposto ad accettare richieste di connessione su un certo socket
	
	return s_listening; //ritorna il socket di listening
}

	
bool decode_msg_from_service_register(char * msg, char * ip, int * porta){
	
	// msg contiene una stringa del tipo: "1;IP_service_provider;porta_service_provider;"
	int i=2;
	char port[BUFFER_SIZE];

	while (msg[i] != ';' && i < BUFFER_SIZE){
		ip[i-2] = msg[i];
		i++;
	}

	if (i == BUFFER_SIZE)
		return false;

	ip[i-2]='\0';
	i++;
	memset (port,0,BUFFER_SIZE);
	while (msg[i] != ';' && i < BUFFER_SIZE){
		port[i-3-strlen(ip)] = msg[i];
		i++;
	}

	if (i == BUFFER_SIZE)
		return false;

	*porta = atoi(port);
	
	return true;
}


int get_len_image(char * nome_file)
{

	FILE *fp;
	int n;	
	 
	if (!(fp = fopen( nome_file, "rb" ))) 
	{
		printf("Errore in apertura");
		return -1;
	 }
	fseek( fp, 0, SEEK_END );
	n = ftell(fp); //mi dice quanto è lungo il file
	fclose(fp);
	
	return n;
}





Service::Service( host client, char * name )
{
	strcpy(this->name,name);
	strcpy(this->client.ip, client.ip);
	this->client.porta = client.porta;
	this->client.s = client.s;
}





